package com.xiaokai.knowledge.domain.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.io.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashSet;
import java.util.Set;

@Slf4j
@Service
public class ArticlePublishService {

    @Autowired
    private ChatClient.Builder chatClientBuilder;

    @Autowired
    private ToolCallbackProvider tools;

    // 历史主题文件路径
    private static final String TOPIC_HISTORY_FILE = "/Users/yangrongkai/Desktop/Projects/learn/ai-mcp-knowledge/ai-mcp-knowledge-app/data/topic_history.txt";

    // 最大尝试次数，防止无限循环
    private static final int MAX_ATTEMPTS = 5;
    
    /**
     * 每天上午10点执行定时任务
     * cron表达式：秒 分 时 日 月 周
     */
    @Scheduled(cron = "0 0 10 * * ?")
    public void publishDailyJavaArticle() {
        log.info("开始执行每日Java面试文章发布任务 - {}", LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

        try {
            // 通过AI获取一个不重复的Java面试主题
            String topic = generateUniqueTopicByAI();
            log.info("AI生成的唯一主题: {}", topic);

            // 保存主题到历史记录
            saveTopicToHistory(topic);

            // 构建提示语
            String prompt = buildPrompt(topic);

            // 调用AI生成并发布文章
            generateAndPublishArticle(prompt);

            log.info("Java面试文章发布成功 - 主题: {}", topic);
        } catch (Exception e) {
            log.error("Java面试文章发布失败", e);
        }
    }

    /**
     * 生成一个不重复的主题
     */
    private String generateUniqueTopicByAI() throws IOException {
        Set<String> historyTopics = loadHistoryTopics();
        String topic = null;
        int attempts = 0;

        while (attempts < MAX_ATTEMPTS) {
            topic = generateTopicByAI();

            // 检查主题是否已存在
            if (!historyTopics.contains(topic.toLowerCase())) {
                return topic;
            }

            log.info("主题 '{}' 已存在，重新生成...", topic);
            attempts++;
        }

        // 如果多次尝试后仍无法生成唯一主题，添加日期后缀使其唯一
        if (topic != null) {
            String uniqueTopic = topic + " - " + LocalDate.now().format(DateTimeFormatter.ISO_DATE);
            log.info("无法生成完全唯一的主题，添加日期后缀: {}", uniqueTopic);
            return uniqueTopic;
        }

        // 极端情况下的备选方案
        return "Java高级特性与最佳实践 - " + LocalDate.now().format(DateTimeFormatter.ISO_DATE);
    }

    /**
     * 加载历史主题记录
     */
    private Set<String> loadHistoryTopics() throws IOException {
        Set<String> topics = new HashSet<>();
        File file = new File(TOPIC_HISTORY_FILE);

        // 确保目录存在
        file.getParentFile().mkdirs();

        // 如果文件不存在，创建空文件
        if (!file.exists()) {
            file.createNewFile();
            return topics;
        }

        // 读取历史主题
        try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
            String line;
            while ((line = reader.readLine()) != null) {
                if (!line.trim().isEmpty()) {
                    topics.add(line.trim().toLowerCase());
                }
            }
        }

        return topics;
    }

    /**
     * 保存主题到历史记录
     */
    private void saveTopicToHistory(String topic) throws IOException {
        File file = new File(TOPIC_HISTORY_FILE);

        // 确保目录存在
        file.getParentFile().mkdirs();

        // 追加写入主题
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(file, true))) {
            writer.write(topic);
            writer.newLine();
        }
    }
    
    /**
     * 通过AI生成Java面试主题
     */
    private String generateTopicByAI() {
        var chatClient = chatClientBuilder
                .defaultOptions(OpenAiChatOptions.builder()
                        .model("deepseek-chat")
                        .build())
                .build();

        String topicPrompt = "请生成一个适合Java 3-5年工作经验开发者的面试主题。主题应该具有技术深度，" +
                "涵盖Java核心技术、框架、架构设计、性能优化等方面。只需返回主题名称，不要有其他解释或额外内容。" +
                "主题应该是具体的，例如'Java并发编程中的CAS原理与应用'，而不是笼统的'Java并发编程'。";

        String response = chatClient.prompt(topicPrompt).call().content().trim();
        
        // 处理返回的主题，去除可能的引号和多余空格
        response = response.replaceAll("^[\"']|[\"']$", "").trim();
        
        return response;
    }
    
    /**
     * 构建AI提示语
     */
    private String buildPrompt(String topic) {
        return String.format(
                "请编写一篇关于'%s'的Java面试文章，内容需要有深度和广度，适合Java 3-5年工作经验的开发者阅读。" +
                "文章需要包含以下部分：\n" +
                "1. 引言：介绍该主题的重要性和在面试中的常见程度\n" +
                "2. 基础知识：该主题的核心概念和基础原理\n" +
                "3. 进阶内容：深入讲解该主题的高级特性和实现原理\n" +
                "4. 实际应用：在实际项目中的应用场景和最佳实践\n" +
                "5. 面试常见问题：列出多个面试中常见的相关问题，并作为资深Java工程师给出答案参考\n" +
                "6. 总结：对主题进行总结并给出学习建议\n" +
                "7. 文章长度建议在1000-3000字之间，字数不限，但需要突出重点。文章需要有图文并茂、代码示例的形式\n\n" +
                "文章标题格式为：'【Java面试系列】%s详解 - 3-5年Java开发必备知识'\n\n" +
                "生成文章后，请将其发布到CSDN平台。",
                topic, topic);
    }
    
    /**
     * 调用AI生成并发布文章
     */
    private void generateAndPublishArticle(String prompt) {
        var chatClient = chatClientBuilder
                .defaultTools(tools)
                .defaultOptions(OpenAiChatOptions.builder()
                        .model("deepseek-chat")
                        .build())
                .build();

        String response = chatClient.prompt(prompt).call().content();
        log.info("AI生成文章响应: {}", response);
    }
    
    /**
     * 手动触发文章发布（用于测试）
     */
    public void manualPublishArticle() {
        publishDailyJavaArticle();
    }
}